Date :.......................... 14 mai 1993
Programme :........................ ZOOL
Protection :......... MOT DE PASSE
Outils : ...............SOFT-ICE V2.50
Temps passé : ..........15 MINUTES
Fichier : .........................................
Société : .....................GREMLINS
Divers : ......Confection d'un lançeur.
Origine :................................... L.F.
Numéro : ..................................214

	Aucun effort n'est fait pour "cacher" l'endroit de la protection.
        Les caractères sont appelés par l'INT 16 SF 00.
	Le test de la touche ENTER suit, puis deux mots sont comparés et,
	si la réponse est mauvaise on quitte.
	Les fichiers ne semblent pas être cryptés mais on ne trouve aucune
	trace des chaînes d'octets à modifier !

	Je confectionne un lançeur centré sur l'INT 16 sf 00.
	Pronfondeur de recherche: 80h.

	Au premier essai j'entends les 3 bips fatidiques, signe que mon lançeur
	a réussi à supprimer la protection.
	Mais stupeur, la protection semble toujours être là. Une erreur de
	programmation peut-être ? Je vérifie, mais tout semble correct.
	Je lance SOFT-ICE et je déroule mon lançeur au pas à pas. Il trouve
	bien le JNZ qu'il remplace par um JMP. Alors quoi ?
	Le programme remettrait-il en place le saut juste après l'appel de
	l'INT 16 ? Impossible. Aucune instruction ne semble le faire et aucun
	CALL n'est appelé entre temps. En examinant attentivement mes pointeurs
	SEGMENT:OFFSET je m'aperçois que la valeur du SEGMENT de mon patch
	remplacé ne coresspond pas au SEGMENT o— se trouve le JNZ à modifier.
	Mon programme a donc trouvé un autre 0374 bien avant le patch réel.
	En fait, au bout de quatre dépilages! Deux solutions: dépiler 4 fois
	en popant sans rien tester ou bien tester un deuxième mot pour être
	sûr d'avoir trouvé le bon endroit.

	Endroit de la demande des caractères:

	CS=10DE	  	
	CS:1BAB B400		MOV	AH,00
	CS:1BAD CD16		INT	16

	Test de la touche ENTER:

	CS:1BD1 3C0D		CMP	AL,0D
	CS:1BD3 742A		JZ	1BFF

	Test du code entré ( deux mots ):

	CS:1BFF A1941C		MOV 	AX,[1C94]
	CS:1C02	8B369B1C	MOV	SI,[1C9B]
	CS:1C06 3B4404		CMP	AX,[SI+04]
	CS:1C09 7403		JZ	1C0E	    ; SI 1ER TEST OK --> 1C0E
	CS:1C0B E9FBFE		JMP	1B09	    ; SI PAS OK.
	CS:1C0E A0961C		MOV	AL,[1C96]
	CS:1C11 3A4406		CMP	AL,[SI+06]
	CS:1C14 7403		JZ	1C19	    ; SI 2EME TEST OK -> 1C19
	CS:1C16 E9F0FE		JMP	1B09	    ; SI PAS OK.
	CS:1C19 E8BE20		CALL	3CDA	    ; SUITE DU JEU.
	CS:1C1C C3		RET

	Il suffit donc de forcer le premier test vers 1C19 à l'aide d'un JMP.

	Ci-dessous les paramètres du lançeur:

;       PATCH POUR LE PROGRAMME ZOOL
;       DETOURNEMENT DE L'INT 16 sf 00
;
;******************************************************************************
;                             ZONE A INITIALISER

adr_ip1         equ     1c09h   ; Adresse dont le contenu est à modifier.
				; Adresse directe.
anc_val         equ     0374h   ; Valeur d'origine à rechercher, inversée.
nouv_val        equ     0eebh   ; Nouvelle valeur inversée: EB0E --> JMP 1C19. 
INT_DET         equ     16h     ; Le numéro de l'INT que l'on veut utiliser.
nb              equ     080h    ; Nombre de dépilage.
BEEP_TONE       equ     440     ; Fréquence de la note.
sous_f          equ      00     ; Valeur de la sous-fonction.
 
;---------------------------- int détournée --------------------------------

int_entry       proc    far
_int:           jmp     apres
_SAUVE_SP	dw      0,0
apres:	        push    ax
		push    ds
		push    bx
		push    cx
		push    dx
		pushf                           ; Push flags
		cmp     ah,sous_f
	        jnz     sort
		mov     dx,301h
		in      al,dx
		mov     word ptr cs:[_SAUVE_SP],sp
		mov     cx,nb
prochain:       pop     ds	;  Je suis obligé de faire 4 dépilages à la
		pop     ds	;  main car un "hit" est trouvé au quatrième	
	        pop     ds	;  dépilage... c'est le hasard.
		pop     ds      ;  --------->     HIT HIT HIT !
		dec     cx
		jz      s                      
		cmp     word ptr ds:[adr_ip1],anc_val   ; Si ok on patche.
		jnz     prochain
		mov     word ptr ds:[adr_ip1],nouv_val  ; On y place le patch.
		xor     bx,bx
		mov     ds,bx                   
		mov     bx,word ptr cs:data_9      ; Je remets manuellement
		mov     ds:[INT_DET*4],bx          ; en place le vecteur
		mov     bx,word ptr cs:data_9+2    ; de l'INT détournée.
		mov     ds:[INT_DET*4+2],bx        
		mov     dx,301h 
		in      al,dx
		.
		.
                .
;* Sound - Sounds speaker with the following tone and duration:
; Ici la routine sonore qui n'est pas listée car c'est la même pour tous mes
; patchs.
		.
		.
		.	
s:              mov     sp,word ptr cs:[_SAUVE_SP]
sort:		popf    
		pop     dx
		pop     cx
		pop     bx
		pop     ds                      
		pop     ax
		jmp     dword ptr cs:data_9
int_entry       endp